﻿using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.IO.Ports;
using puerto_serie;
using System.Threading; 

namespace puerto_serie 
{ 
    public partial class Form1 : Form,Observer 
    {
        ControladorJuego Controlador_;
        Thread workerThread;
        public Form1() 
        { 
            InitializeComponent();
        }
        public void startThread()
        {
            workerThread.Start();
        }
        private void MensajesPorConsola()
        {
            while (true) // Loop indefinitely
            {
               // Console.WriteLine("Enter input:");
                //string line = Console.ReadLine();
                int ingresarDato;
                try
                {
                    string line = serialPort1.ReadLine();
                    Console.WriteLine(line);
                    ingresarDato = int.Parse(line);
                    Controlador_.ReceiveMessage(ingresarDato);
                }
                catch (Exception e)
                {
                   
                }
                
            }
        }
        public void Update(byte datoEnviar)
        {
            envio(datoEnviar);
        }
        private void configura_puerto(string npuerto, int baudios, Parity paridad, int nBits, StopBits bits_parada) 
        { 
            serialPort1 = new SerialPort(npuerto, baudios, paridad, nBits, bits_parada); 
        } 
        private void busca_puertos() 
        { 
            // Obtenemos los puertos que se encuentran configurados en el equipo 
            string[] ports = SerialPort.GetPortNames(); 
            cmbPuerto.Items.Clear(); 
            // Los desplegamos en el ComboBox 
            foreach (string port in ports) 
            { 
                cmbPuerto.Items.Add(port); 
            } 
            cmbPuerto.Text = "Seleccione Puerto"; 
        } 
        private void Form1_Load(object sender, EventArgs e)
        {
            busca_puertos();
        }

        private void btnAbrir_Click(object sender, EventArgs e)
        {
            if (serialPort1 != null)
            {
                serialPort1.Open();
                if (serialPort1.IsOpen == true)
                {
                    workerThread = new Thread(this.MensajesPorConsola);
                    startThread();
                    MessageBox.Show("Puerto abierto");
                }
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            if (serialPort1 != null)
            {
                if (serialPort1.IsOpen == true)
                {
                    serialPort1.Close();
                    MessageBox.Show("Puerto cerrado");
                }
            }
        }

        private void btnConfigurar_Click(object sender, EventArgs e)
        {
            Parity Paridad = Parity.None;
            StopBits BitsParada = StopBits.One;
            int numBits = 8;
            configura_puerto(cmbPuerto.Text, 9200, Paridad, numBits, BitsParada);
            MessageBox.Show("Puerto configurado");
        }
        
        private void envio(byte datoEnviar)
        {
            if ((serialPort1 != null) && (serialPort1.IsOpen == true))
            {
                try
                {
                    serialPort1.DiscardNull = false;
                    byte[] buffer = new byte[1];
                    buffer[0] = datoEnviar;
                    serialPort1.Write(buffer, 0, buffer.Length);
                }
                catch (Exception)
                {
                    MessageBox.Show("Hubo una excepcion en el programa");
                }
            }
            else
            {
                MessageBox.Show("Hubo un error los puertos no estan configurados");
            }
        }

        private void ApplicationInitializer_Click(object sender, EventArgs e)
        {
            Controlador_ = new ControladorJuego();
            FormEscogerBarco f = new FormEscogerBarco();
            f.Show();
            Controlador_.Attach(this);
            f.setControlador( Controlador_);
        }
    }
}